package identify

import (
	"fmt"
	"log"
	"time"
	"yoga/config"

	"github.com/golang-jwt/jwt/v5"
)

type Claims struct {
	UserID int    `json:"user_id"`
	Auth   string `json:"auth"`
	jwt.RegisteredClaims
}

// 生成一个token
func GenerateToken(userID int, auth string) (string, error) {
	expirationTime := time.Now().Add(time.Duration(config.Config.Token.Hour) * time.Hour)

	// 创建声明内容
	claims := &Claims{
		UserID: userID,
		Auth:   auth,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(expirationTime),
			IssuedAt:  jwt.NewNumericDate(time.Now()),
			NotBefore: jwt.NewNumericDate(time.Now()),
		},
	}
	// 创建 Token
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	// 签名并生成完整的 Token 字符串
	return token.SignedString([]byte(config.Config.Token.Secret))
}

// 验证这个token是否正确
func IdentifyToken(tokenString string) (*Claims, error) {
	claims := &Claims{}
	token, err := jwt.ParseWithClaims(tokenString, claims, func(jwtToken *jwt.Token) (any, error) {
		return []byte(config.Config.Token.Secret), nil // 注意加 []byte
	})
	if err != nil {
		// token 格式错误或签名错误
		return nil, err
	}
	if !token.Valid {
		// token 已过期或无效
		return nil, fmt.Errorf("invalid token")
	}
	return claims, nil
}

func InitToken() { // 测试生成一个token
	testToken, err := GenerateToken(0, "admin")
	if err != nil {
		log.Println("生成token失败", err)
	}
	fmt.Println("测试token:", testToken)
}
